beds_specialty <- read_csv("raw_data/beds_specialty.csv") %>%
  clean_names()
Rows: 30394 Columns: 20
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): Quarter, QuarterQF, HB, HBQF, Location, LocationQF, Specialty, SpecialtyQF, SpecialtyName, Specialty...
dbl  (5): AllStaffedBeds, TotalOccupiedBeds, AverageAvailableStaffedBeds, AverageOccupiedBeds, PercentageOccup...
lgl  (5): AllStaffedBedsQF, TotalOccupiedBedsQF, AverageAvailableStaffedBedsQF, AverageOccupiedBedsQF, Percent...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
map_beds <- beds_specialty %>%
  filter(location_qf == "d") %>% 
  mutate(year = year(yq(quarter)),
         quarter = str_sub(quarter, -2),
         winter_flag = if_else(quarter %in% c("Q1", "Q4"), "Winter", "Summer")) %>%
  select(year, winter_flag, hb, specialty_name, percentage_occupancy) %>% 
  group_by(winter_flag, year, hb) %>% 
  summarise(percentage_occupancy = mean(percentage_occupancy)) %>% 
  mutate(hb_name = case_when(
    hb == "S92000003" ~ "Scotland",
    hb == "S08000015" ~ "Ayrshire & Arran",
    hb == "S08000016" ~ "Borders",
    hb == "S08000017" ~ "Dumfries & Galloway",
    hb == "S08000019" ~ "Forth Valley",
    hb == "S08000020" ~ "Grampian",
    hb == "S08000022" ~ "Highland",
    hb == "S08000024" ~ "Lothian",
    hb == "S08000025" ~ "Orkney",
    hb == "S08000026" ~ "Shetland",
    hb == "S08000028" ~ "Western Isles",
    hb == "S08000029" ~ "Fife",
    hb == "S08000030" ~ "Tayside",
    hb == "S08000031" ~ "Greater Glasgow & Clyde",
    hb == "S08000032" ~"Lanarkshire",
    TRUE ~ as.character(NA))) %>% 
  filter(!is.na(hb_name)) %>% 
  rename(hb_code = hb)
`summarise()` has grouped output by 'winter_flag', 'year'. You can override using the `.groups` argument.
write_csv(map_beds, "clean_data/map_beds.csv")

simplified_shapes <- st_transform(rmapshaper::ms_simplify(st_read(
  "raw_data/nhs_hb_2019/nhs_hb_2019.shp")),"CRS:84") %>%
  clean_names()
Reading layer `nhs_hb_2019' from data source 
  `/Users/reutersvard/codeclan/de11_project/raw_data/nhs_hb_2019/nhs_hb_2019.shp' using driver `ESRI Shapefile'
Simple feature collection with 14 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 5512.998 ymin: 530250.8 xmax: 470332 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
# st_write(simplified_shapes, "clean_data/hb_clean.shp") If it doesn't exist, create a clean shapes file
rm(beds_specialty, map_beds, simplified_shapes)
map_beds <- read_csv("clean_data/map_beds.csv")
Rows: 180 Columns: 5
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): winter_flag, hb_code, hb_name
dbl (2): year, percentage_occupancy

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
  
filtered_beds <- map_beds %>%
  filter(year == 2020,
         winter_flag == "Winter")

shapes <- st_read("clean_data/hb_clean.shp")
Reading layer `hb_clean' from data source `/Users/reutersvard/codeclan/de11_project/clean_data/hb_clean.shp' using driver `ESRI Shapefile'
Simple feature collection with 14 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -8.649439 ymin: 54.63336 xmax: -0.7251864 ymax: 60.86076
Geodetic CRS:  WGS 84
merged <- sp::merge(shapes, filtered_beds) %>% 
  select(hb_name, percentage_occupancy, geometry)
pal <- colorBin("BuPu", domain = merged$percentage_occupancy)

merged %>%
  leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap) %>%
  addPolygons(
    fillColor = ~ pal(percentage_occupancy),
    weight = 2,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    highlight = highlightOptions(
      weight = 5,
      color = "#666",
      dashArray = "",
      fillOpacity = 0.7,
      bringToFront = TRUE),
    label = paste0(merged$hb_name, ":", " ", round(merged$percentage_occupancy), "%"),
    labelOptions = labelOptions(
      style = list("font-weight" = "normal", padding = "3px 8px"),
      textsize = "15px",
      direction = "auto"),
    popup = paste0(merged$hb_name, ":", " ", round(merged$percentage_occupancy, digits = 2), "%")) %>%
  leaflet::addLegend("topleft", pal = pal, values = ~percentage_occupancy,
    title = "Bed Occupancy",
    opacity = 1)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7ciBpbmNsdWRlID0gRn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2YpCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShodG1sdG9vbHMpCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KYmVkc19zcGVjaWFsdHkgPC0gcmVhZF9jc3YoInJhd19kYXRhL2JlZHNfc3BlY2lhbHR5LmNzdiIpICU+JQogIGNsZWFuX25hbWVzKCkKCm1hcF9iZWRzIDwtIGJlZHNfc3BlY2lhbHR5ICU+JQogIGZpbHRlcihsb2NhdGlvbl9xZiA9PSAiZCIpICU+JSAKICBtdXRhdGUoeWVhciA9IHllYXIoeXEocXVhcnRlcikpLAogICAgICAgICBxdWFydGVyID0gc3RyX3N1YihxdWFydGVyLCAtMiksCiAgICAgICAgIHdpbnRlcl9mbGFnID0gaWZfZWxzZShxdWFydGVyICVpbiUgYygiUTEiLCAiUTQiKSwgIldpbnRlciIsICJTdW1tZXIiKSkgJT4lCiAgc2VsZWN0KHllYXIsIHdpbnRlcl9mbGFnLCBoYiwgc3BlY2lhbHR5X25hbWUsIHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSAlPiUgCiAgZ3JvdXBfYnkod2ludGVyX2ZsYWcsIHllYXIsIGhiKSAlPiUgCiAgc3VtbWFyaXNlKHBlcmNlbnRhZ2Vfb2NjdXBhbmN5ID0gbWVhbihwZXJjZW50YWdlX29jY3VwYW5jeSkpICU+JSAKICBtdXRhdGUoaGJfbmFtZSA9IGNhc2Vfd2hlbigKICAgIGhiID09ICJTOTIwMDAwMDMiIH4gIlNjb3RsYW5kIiwKICAgIGhiID09ICJTMDgwMDAwMTUiIH4gIkF5cnNoaXJlICYgQXJyYW4iLAogICAgaGIgPT0gIlMwODAwMDAxNiIgfiAiQm9yZGVycyIsCiAgICBoYiA9PSAiUzA4MDAwMDE3IiB+ICJEdW1mcmllcyAmIEdhbGxvd2F5IiwKICAgIGhiID09ICJTMDgwMDAwMTkiIH4gIkZvcnRoIFZhbGxleSIsCiAgICBoYiA9PSAiUzA4MDAwMDIwIiB+ICJHcmFtcGlhbiIsCiAgICBoYiA9PSAiUzA4MDAwMDIyIiB+ICJIaWdobGFuZCIsCiAgICBoYiA9PSAiUzA4MDAwMDI0IiB+ICJMb3RoaWFuIiwKICAgIGhiID09ICJTMDgwMDAwMjUiIH4gIk9ya25leSIsCiAgICBoYiA9PSAiUzA4MDAwMDI2IiB+ICJTaGV0bGFuZCIsCiAgICBoYiA9PSAiUzA4MDAwMDI4IiB+ICJXZXN0ZXJuIElzbGVzIiwKICAgIGhiID09ICJTMDgwMDAwMjkiIH4gIkZpZmUiLAogICAgaGIgPT0gIlMwODAwMDAzMCIgfiAiVGF5c2lkZSIsCiAgICBoYiA9PSAiUzA4MDAwMDMxIiB+ICJHcmVhdGVyIEdsYXNnb3cgJiBDbHlkZSIsCiAgICBoYiA9PSAiUzA4MDAwMDMyIiB+IkxhbmFya3NoaXJlIiwKICAgIFRSVUUgfiBhcy5jaGFyYWN0ZXIoTkEpKSkgJT4lIAogIGZpbHRlcighaXMubmEoaGJfbmFtZSkpICU+JSAKICByZW5hbWUoaGJfY29kZSA9IGhiKQoKd3JpdGVfY3N2KG1hcF9iZWRzLCAiY2xlYW5fZGF0YS9tYXBfYmVkcy5jc3YiKQoKIyBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBjbGVhbiBzaGFwZXMgZmlsZQojIHNpbXBsaWZpZWRfc2hhcGVzIDwtIHN0X3RyYW5zZm9ybShybWFwc2hhcGVyOjptc19zaW1wbGlmeShzdF9yZWFkKAojICAgInJhd19kYXRhL25oc19oYl8yMDE5L25oc19oYl8yMDE5LnNocCIpKSwiQ1JTOjg0IikgJT4lCiMgICBjbGVhbl9uYW1lcygpCiMgc3Rfd3JpdGUoc2ltcGxpZmllZF9zaGFwZXMsICJjbGVhbl9kYXRhL2hiX2NsZWFuLnNocCIpIAoKcm0oYmVkc19zcGVjaWFsdHksIG1hcF9iZWRzLCBzaW1wbGlmaWVkX3NoYXBlcykKYGBgCgpgYGB7cn0KbWFwX2JlZHMgPC0gcmVhZF9jc3YoImNsZWFuX2RhdGEvbWFwX2JlZHMuY3N2IikKICAKZmlsdGVyZWRfYmVkcyA8LSBtYXBfYmVkcyAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDIwLAogICAgICAgICB3aW50ZXJfZmxhZyA9PSAiV2ludGVyIikKCnNoYXBlcyA8LSBzdF9yZWFkKCJjbGVhbl9kYXRhL2hiX2NsZWFuLnNocCIpCgptZXJnZWQgPC0gc3A6Om1lcmdlKHNoYXBlcywgZmlsdGVyZWRfYmVkcykgJT4lIAogIHNlbGVjdChoYl9uYW1lLCBwZXJjZW50YWdlX29jY3VwYW5jeSwgZ2VvbWV0cnkpCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KcGFsIDwtIGNvbG9yQmluKCJCdVB1IiwgZG9tYWluID0gbWVyZ2VkJHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KQoKbWVyZ2VkICU+JQogIGxlYWZsZXQoKSAlPiUKICBhZGRUaWxlcygpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXApICU+JQogIGFkZFBvbHlnb25zKAogICAgZmlsbENvbG9yID0gfiBwYWwocGVyY2VudGFnZV9vY2N1cGFuY3kpLAogICAgd2VpZ2h0ID0gMiwKICAgIG9wYWNpdHkgPSAxLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZGFzaEFycmF5ID0gIjMiLAogICAgZmlsbE9wYWNpdHkgPSAwLjcsCiAgICBoaWdobGlnaHQgPSBoaWdobGlnaHRPcHRpb25zKAogICAgICB3ZWlnaHQgPSA1LAogICAgICBjb2xvciA9ICIjNjY2IiwKICAgICAgZGFzaEFycmF5ID0gIiIsCiAgICAgIGZpbGxPcGFjaXR5ID0gMC43LAogICAgICBicmluZ1RvRnJvbnQgPSBUUlVFKSwKICAgIGxhYmVsID0gcGFzdGUwKG1lcmdlZCRoYl9uYW1lLCAiOiIsICIgIiwgcm91bmQobWVyZ2VkJHBlcmNlbnRhZ2Vfb2NjdXBhbmN5KSwgIiUiKSwKICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucygKICAgICAgc3R5bGUgPSBsaXN0KCJmb250LXdlaWdodCIgPSAibm9ybWFsIiwgcGFkZGluZyA9ICIzcHggOHB4IiksCiAgICAgIHRleHRzaXplID0gIjE1cHgiLAogICAgICBkaXJlY3Rpb24gPSAiYXV0byIpLAogICAgcG9wdXAgPSBwYXN0ZTAobWVyZ2VkJGhiX25hbWUsICI6IiwgIiAiLCByb3VuZChtZXJnZWQkcGVyY2VudGFnZV9vY2N1cGFuY3ksIGRpZ2l0cyA9IDIpLCAiJSIpKSAlPiUKICBsZWFmbGV0OjphZGRMZWdlbmQoInRvcGxlZnQiLCBwYWwgPSBwYWwsIHZhbHVlcyA9IH5wZXJjZW50YWdlX29jY3VwYW5jeSwKICAgIHRpdGxlID0gIkJlZCBPY2N1cGFuY3kiLAogICAgb3BhY2l0eSA9IDEpCmBgYAo=